package de.uni_luebeck.inb.krabbenhoeft.eQTL.client;
import java.util.Map;
import com.google.gwt.core.client.EntryPoint;
import com.google.gwt.core.client.GWT;
import com.google.gwt.event.logical.shared.SelectionEvent;
import com.google.gwt.event.logical.shared.SelectionHandler;
import com.google.gwt.event.logical.shared.ValueChangeEvent;
import com.google.gwt.event.logical.shared.ValueChangeHandler;
import com.google.gwt.uibinder.client.UiBinder;
import com.google.gwt.uibinder.client.UiField;
import com.google.gwt.user.client.Command;
import com.google.gwt.user.client.Timer;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.LayoutPanel;
import com.google.gwt.user.client.ui.MenuBar;
import com.google.gwt.user.client.ui.MenuItem;
import com.google.gwt.user.client.ui.RootLayoutPanel;
import com.google.gwt.user.client.ui.RootPanel;
import com.google.gwt.user.client.ui.Widget;
import de.uni_luebeck.inb.krabbenhoeft.eQTL.api.gwt.DataRetrieval;
import de.uni_luebeck.inb.krabbenhoeft.eQTL.api.gwt.DataRetrievalAsync;
import de.uni_luebeck.inb.krabbenhoeft.eQTL.api.gwt.DataSetLayerOverview;
import de.uni_luebeck.inb.krabbenhoeft.eQTL.api.gwt.DataSetOverview;
public class ClientMainWindow implements EntryPoint {
public static void notifyUser(String message, int timeout) {
final Label label = notifyUserAdd(message);
new Timer() {
public void run() {
notifyUserRem(label);
}
}.schedule(timeout);
}
public static Label notifyUserAdd(String message) {
final RootPanel messagePanel = RootPanel.get("messages");
final Label label = new Label(message, true);
messagePanel.add(label);
return label;
}
public static void notifyUserRem(Label label) {
final RootPanel messagePanel = RootPanel.get("messages");
messagePanel.remove(label);
}
interface ClientMainWindowUiBinder extends UiBinder<Widget, ClientMainWindow> {
}
private static ClientMainWindowUiBinder uiBinder = GWT.create(ClientMainWindowUiBinder.class);
private final DataRetrievalAsync dataRetrievalService = GWT.create(DataRetrieval.class);
private final MyMessages myMessages = (MyMessages) GWT.create(MyMessages.class);
private DataSetOverview dataSetOverview;
@UiField
MenuBar loadMenu;
@UiField
MenuItem menuItemForLayers;
public void onModuleLoad() {
if (RootPanel.get("content").getElement().getElementsByTagName("a").getLength() > 0)
return; // user is seeing login error
RootLayoutPanel.get().add(uiBinder.createAndBindUi(this));
new AutoRetry<Map<Integer, String>>() {
public void success(Map<Integer, String> result) {
for (final Map.Entry<Integer, String> dataSet : result.entrySet()) {
MenuItem menuItem = new MenuItem(dataSet.getValue(), new Command() {
public void execute() {
selectDataSet(dataSet.getKey(), dataSet.getValue());
}
});
loadMenu.addItem(menuItem);
}
}
public void invoke(AsyncCallback<Map<Integer, String>> callback) {
dataRetrievalService.enumerateDataSets(callback);
}
}.run();
}
public void selectDataSet(final Integer key, String name) {
dataSetOverview = null;
menuItemForLayers.setVisible(false);
ClientMainWindow.notifyUser(myMessages.selectedDataSet(name), 1000);
new AutoRetry<DataSetOverview>() {
public void success(DataSetOverview result) {
dataSetOverview = result;
updateDataSetViews();
}
public void invoke(AsyncCallback<DataSetOverview> callback) {
dataRetrievalService.getOverview(key, callback);
}
}.run();
}
@UiField
LayoutPanel layerViewContainer, layerRowsContainer;
public void updateDataSetViews() {
layerViewContainer.clear();
layerRowsContainer.clear();
final DataSetLayerSelector dataSetLayerSelector = new DataSetLayerSelector(dataSetOverview, menuItemForLayers);
dataSetLayerSelector.addValueChangeHandler(new ValueChangeHandler<DataSetLayerOverview>() {
public void onValueChange(ValueChangeEvent<DataSetLayerOverview> event) {
selectDataSetLayer(dataSetLayerSelector, event.getValue());
}
});
layerViewContainer.add(dataSetLayerSelector);
}
private void selectDataSetLayer(final DataSetLayerSelector dataSetLayerSelector, DataSetLayerOverview selectedLayer) {
layerRowsContainer.clear();
final LayerRowsContainer dataSetLayerContents = new LayerRowsContainer(selectedLayer);
dataSetLayerContents.addSelectionHandler(new SelectionHandler<DataSetLayerOverview>() {
public void onSelection(SelectionEvent<DataSetLayerOverview> event) {
dataSetLayerSelector.addAndSelectNewLayer(event.getSelectedItem());
}
});
layerRowsContainer.add(dataSetLayerContents);
}
}